# 视图

from django.shortcuts import render, redirect
from django.views import View
from django import http
import re

from .models import User
from django_redis import get_redis_connection  # get_redis_connection是redis方法的获取
from django.contrib.auth import authenticate, login, logout


# 1.注册用户
class UserRegiserView(View):  # UserRegiserView视图函数
    def get(self, request):
        return render(request, 'register.html')

    def post(self, request):  # 此处为提交
        # 1.获取参数
        dict_data = request.POST  # request.POST表单提交
        user_name = dict_data.get('user_name')  # dict_data得到的是字典
        pwd = dict_data.get('pwd')
        cpwd = dict_data.get('cpwd')
        phone = dict_data.get('phone')
        pic_code = dict_data.get('pic_code')
        msg_code = dict_data.get('msg_code')
        allow = dict_data.get('allow')

        # 2.校验参数
        # 2.1为空校验
        if not all([user_name, pwd, cpwd, phone, pic_code, allow, msg_code]):
            return http.HttpResponseBadRequest('参数不全')  # HttpResponseBadRequest禁止访问404

        # 2.2校验用户格式
        if not re.match(r'^[a-zA-Z0-9_-]{5,20}$', user_name):  # re模块可以校验,match匹配
            return http.HttpResponseBadRequest('用户名格式错误')

        # 2.3校验密码长度
        if not re.match(r'^[0-9A-Za-z]{8,20}$', pwd):
            return http.HttpResponseBadRequest('密码格式有误')  # HttpResponse可以访问200
        # 2.4判断两次密码是否一致
        if pwd != cpwd:
            return http.HttpResponseBadRequest('两次密码不一致')

        # 2.5校验手机号格式
        if not re.match(r'^1[345789]\d{9}$', phone):
            return http.HttpResponseBadRequest('手机号格式有误')

        # 2.6校验短信验证码
        redis_conn = get_redis_connection('code')  # 运用 dev.CACHES.code
        redis_sms_code = redis_conn.get('sms_code_%s' % phone)

        # 判断是否过期
        if not redis_sms_code:
            return http.HttpResponseForbidden('短信验证码已过期')

        # 正确性校验
        if msg_code != redis_sms_code.decode():
            # return http.HttpResponseForbidden('短息验证码错误')  #跳转一个页面显示信息提醒
            return render(request, 'register.html', context={'errmsg': '短息验证码错误'})  # 信息填入框下方显示信息提醒    render()是重新渲染注册表单

        # 2.7校验协议
        if allow != 'on':
            return http.HttpResponseBadRequest('必须同意协议')

        # 3.创建用户对象,导入数据库
        User.objects.create_user(username=user_name, password=pwd, mobile=phone)  # 在User里面的手机号赋值给了mobile,所有

        # 4.返回响应    重定向网页
        return redirect('https://www.bilibili.com')  # 一旦注册成功就跳转到指定页面,redirect 重定向


# 2.检查用户
class CheckUsernameView(View):
    def get(self, request, username):
        # 1.根据用户名,查询用户数量
        # User.objects.count()#查询所有数量
        count = User.objects.filter(username=username).count()  # 查询username这个用户的数量

        # 2.返回响应
        return http.JsonResponse({'count': count})  # 由于前端代码的请求需要返回json

        pass


# 3.检查手机号码是否存在
class CheckMobileView(View):
    def get(self, request, mobile):
        # 1.根据手机号,查询用户数量
        count = User.objects.filter(mobile=mobile).count()
        # 2.返回响应
        return http.JsonResponse({'count': count})

        pass


# 4.处理登陆业务
class UserLoginView(View):
    def get(self, request):
        return render(request, 'login.html')

    # 格式      渲染视图 (request(自带),html页面,字典形式的数据)

    def post(self, request):
        # 1.获取参数
        username = request.POST.get('username')
        password = request.POST.get('pwd')
        remebered = request.POST.get('remebered')

        # 2.校验参数
        # 2.1为空校验
        if not all([username, password]):
            return http.HttpResponseForbidden('参数不全')

        # 2.2用户名格式校验
        if not re.match(r'^[a-zA-Z0-9_-]{5,20}$', username):  # re的导包,对用户进行操作等功能作用
            return http.HttpResponseForbidden('用户名格式错误')

        # 2.3密码格式校验
        if not re.match(r'^[0-9A-Za-z]{8,20}$', password):
            return http.HttpResponseForbidden('用户密码错误')

        # 2.4校验账号 密码正确性(认证) 并判断是否认证成功
        user = authenticate(request, username=username, password=password)  # django文档中使用认证系统中如何登入一个用户中有写好的方法可调用
        if not user:
            return http.HttpResponseForbidden('用户名或者密码错误')

        # 3.状态保持
        login(request, user)  # 记录用户信息到session

        if remebered == 'on':
            request.session.set_expiry(3600 * 24 * 2)  # 两天有效
        else:
            request.session.set_expiry(0)  # 0s代表不保持
        # 4.返回相应
        response = redirect('/')
        response.set_cookie('username', user.username, max_age=3600 * 24 * 2)
        # set_cookie是设置cookie把首页转存为已登录状态,并且保持两天
        return response


# 5.退出用户
class UserLogoutView(View):
    def get(self, request):
        # 1.清除session
        logout(request)

        # 2.清除cookie,username,返回相应
        response = redirect('/')
        response.delete_cookie('username')
        return response
